package data

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log"
	"os"
)

const (
	msgChan       = "proxy/msg/chan"
	msgChanByPort = "proxy/msg/chan/%d"
)

var (
	redisCli *redis.Client

	// var sqlDb *sql.DB // 数据库连接db
)

func Init(proxyPort []int64) {
	Subscriberinfo = make(map[string]*SubscriberHandler, 0)
	SubscriberinfoV2 = make(map[int64]map[string]*SubscriberHandler, 0)
	initRedis(proxyPort)
}

// func initMysql() {
// // 1、打开数据库
// // parseTime:时间格式转换(查询结果为时间时，是否自动解析为时间);
// // loc=Local：MySQL的时区设置
// sqlStr := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8&parseTime=true&loc=Local"
// var err error
// sqlDb, err = sql.Open("mysql", sqlStr)
// if err != nil {
// 	fmt.Println("数据库打开出现了问题：", err)
// 	return
// }
// // 2、 测试与数据库建立的连接（校验连接是否正确）
// err = sqlDb.Ping()
// if err != nil {
// 	fmt.Println("数据库连接出现了问题：", err)
// 	return
// }
// }

// initRedis 初始化redis启动监听
func initRedis(proxyPort []int64) {
	redisCli = redis.NewClient(&redis.Options{
		Addr:               "127.0.0.1:6379",
		ReadTimeout:        -1,
		IdleCheckFrequency: -1,
	})
	if _, err := redisCli.Ping(context.Background()).Result(); err != nil {
		log.Println(err.Error())
		os.Exit(-1)
	}

	for _, portTmp := range proxyPort {
		subscribeMsg(portTmp)
	}

	subscribeMsg(0)
}

// getSubscribeKey 获取监听的广播key
func getSubscribeKey(port int64) string {
	if port != 0 {
		return fmt.Sprintf(msgChanByPort, port)
	}
	return msgChan
}

// subscribeMsg 监听对应的广播key
// 0 表示不区分端口的版本
func subscribeMsg(port int64) {
	key := getSubscribeKey(port)
	go func() {
		pubsub := redisCli.Subscribe(context.Background(), key)
		defer pubsub.Close()
		msgChan := pubsub.Channel()
		for {
			select {
			case msg, ok := <-msgChan:
				// log.Printf("recv msg, channal:%s, msg:%s", msg.Channel, msg.String())
				if !ok {
					log.Printf("recv msgChan closed.")
					return
				}
				go func() {
					msgTmp := msg
					broadMsg(msgTmp.Payload, port)
				}()

			}
		}
	}()
}
